home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / xip / iijppp.lzh / src / systems.c < prev    next >
C/C++ Source or Header  |  1994-10-21  |  4KB  |  214 lines

  1. /*
  2.  *              System configuration routines
  3.  *
  4.  *        Written by Toshiharu OHNO (tony-o@iij.ad.jp)
  5.  *
  6.  *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
  7.  *
  8.  * Redistribution and use in source and binary forms are permitted
  9.  * provided that the above copyright notice and this paragraph are
  10.  * duplicated in all such forms and that any documentation,
  11.  * advertising materials, and other materials related to such
  12.  * distribution and use acknowledge that the software was developed
  13.  * by the Internet Initiative Japan, Inc.  The name of the
  14.  * IIJ may not be used to endorse or promote products derived
  15.  * from this software without specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  *
  20.  *  TODO:
  21.  */
  22. #include "fsm.h"
  23. #include "vars.h"
  24. #include "ipcp.h"
  25.  
  26. extern void DecodeCommand();
  27.  
  28. static int uid, gid;
  29. static int euid, egid;
  30. static int usermode;
  31.  
  32. void
  33. GetUid()
  34. {
  35.   uid = getuid();
  36.   gid = getgid();
  37.   euid = geteuid();
  38.   egid = getegid();
  39.   usermode = 0;
  40. }
  41.  
  42. static void
  43. SetUserId()
  44. {
  45.   if (!usermode) {
  46. #ifdef __FreeBSD__
  47.     setruid(euid);
  48.     seteuid(uid);
  49.     setrgid(egid);
  50.     setegid(gid);
  51. #else
  52.     setreuid(euid, uid);
  53.     setregid(egid, gid);
  54. #endif
  55.     usermode = 1;
  56.   }
  57. }
  58.  
  59. static void
  60. SetPppId()
  61. {
  62.   if (usermode) {
  63. #ifdef __FreeBSD__
  64.     setruid(uid);
  65.     seteuid(euid);
  66.     setrgid(gid);
  67.     setegid(egid);
  68. #else
  69.     setreuid(uid, euid);
  70.     setregid(gid, egid);
  71. #endif
  72.     usermode = 0;
  73.   }
  74. }
  75.  
  76. FILE *
  77. OpenSecret(file)
  78. char *file;
  79. {
  80.   FILE *fp;
  81.   char *cp;
  82.   char line[100];
  83.  
  84.   fp = NULL;
  85.   cp = getenv("HOME");
  86.   if (cp) {
  87.     SetUserId();
  88.     sprintf(line, "%s/.%s", cp, file);
  89.     fp = fopen(line, "r");
  90.   }
  91.   if (fp == NULL) {
  92.     SetPppId();
  93.     sprintf(line, "/etc/%s", file);
  94.     fp = fopen(line, "r");
  95.   }
  96.   if (fp == NULL) {
  97.     fprintf(stderr, "can't open %s.\n", line);
  98.     SetPppId();
  99.     return(NULL);
  100.   }
  101.   return(fp);
  102. }
  103.  
  104. void
  105. CloseSecret(fp)
  106. FILE *fp;
  107. {
  108.   fclose(fp);
  109.   SetPppId();
  110. }
  111.  
  112. int
  113. SelectSystem(name, file)
  114. char *name;
  115. char *file;
  116. {
  117.   FILE *fp;
  118.   char *cp, *wp;
  119.   int n;
  120.   int val = -1;
  121.   char line[200];
  122.  
  123.   fp = NULL;
  124.   cp = getenv("HOME");
  125.   if (cp) {
  126.     SetUserId();
  127.     sprintf(line, "%s/.%s", cp, file);
  128.     fp = fopen(line, "r");
  129.   }
  130.   if (fp == NULL) {
  131.     SetPppId();        /* fix from pdp@ark.jr3uom.iijnet.or.jp */
  132.     sprintf(line, "/etc/%s", file);
  133.     fp = fopen(line, "r");
  134.   }
  135.   if (fp == NULL) {
  136.     fprintf(stderr, "can't open %s.\n", line);
  137.     SetPppId();
  138.     return(-1);
  139.   }
  140. #ifdef DEBUG
  141.   fprintf(stderr, "checking %s (%s).\n", name, line);
  142. #endif
  143.   while (fgets(line, sizeof(line), fp)) {
  144.     cp = line;
  145.     switch (*cp) {
  146.     case '#':        /* comment */
  147.       break;
  148.     case ' ':
  149.     case '\t':
  150.       break;
  151.     default:
  152.       wp = strpbrk(cp, ":\n");
  153.       *wp = '\0';
  154.       if (strcmp(cp, name) == 0) {
  155.     while (fgets(line, sizeof(line), fp)) {
  156.       cp = line;
  157.       if (*cp == ' ' || *cp == '\t') {
  158.         n = strspn(cp, " \t");
  159.         cp += n;
  160. #ifdef DEBUG
  161.         fprintf(stderr, "%s", cp);
  162. #endif
  163.         SetPppId();
  164.         DecodeCommand(cp, strlen(cp), 0);
  165.         SetUserId();
  166.       } else if (*cp == '#') {
  167.         continue;
  168.       } else
  169.         break;
  170.     }
  171.     fclose(fp);
  172.     SetPppId();
  173.     return(0);
  174.       }
  175.       break;
  176.     }
  177.   }
  178.   fclose(fp);
  179.   SetPppId();
  180.   return(val);
  181. }
  182.  
  183. int
  184. LoadCommand(list, argc, argv)
  185. struct cmdtab *list;
  186. int argc;
  187. char **argv;
  188. {
  189.   char *name;
  190.  
  191.   if (argc > 0)
  192.     name = *argv;
  193.   else
  194.     name = "default";
  195.  
  196.   if (SelectSystem(name, CONFFILE) < 0) {
  197.     printf("%s: not found.\n", name);
  198.     return(-1);
  199.   }
  200.   return(1);
  201. }
  202.  
  203. extern struct in_addr ifnetmask;
  204.  
  205. int
  206. SaveCommand(list, argc, argv)
  207. struct cmdtab *list;
  208. int argc;
  209. char **argv;
  210. {
  211.   printf("save command is not implemented (yet).\n");
  212.   return(1);
  213. }
  214.